package com.tao.YanMoDesignPattern.Order.case3_bake;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author Mi_Tao
 * @Date 2023/8/26
 * @Description 计算器类，计算器上有加法按钮，减法按钮
 * @Version 1.0
 **/
public class Calculator {

    // 命令的操作历史，在撤销的时候使用
    private List<Command> undoComs = new ArrayList<>();

    // 持有撤销命令对象,在恢复的时候使用
    private List<Command> redoComs = new ArrayList<>();

    // 持有执行加法的命令对象
    private AddCommand addCommand = null;

    public void setSubCommand(SubstarctCommand subCommand) {
        this.subCommand = subCommand;
    }

    // 持有减法的命令对象
    private SubstarctCommand subCommand = null;

    public AddCommand getAddCommand() {
        return addCommand;
    }

    public void setAddCommand(AddCommand addCommand) {
        this.addCommand = addCommand;
    }

    /**
     * 核心：撤销功能
     */
    public void undoPressed(){
       if (this.undoComs.size()>0){
           // 取出最后一个命令对象
           Command command = this.undoComs.get(this.undoComs.size()-1);
           // 撤销
           command.undo();
           // 有恢复功能，把这个命令记录到恢复的历史表种
           this.redoComs.add(command);
           // 然后把最后一个命令删除掉
           this.undoComs.remove(command);
       }else {
           System.out.println("很抱歉，没有历史记录可以撤销了！");
       }
    }

    /**
     * 核心：恢复功能
     */
    public void redoPressded(){
        if (this.redoComs.size()>0){
            // 取出最后一个命令对象
            Command command = this.redoComs.get(this.redoComs.size()-1);
            // 恢复
            command.execute();
            // 把这个命令记录到可撤销的历史记录里面
            this.undoComs.add(command);
            // 然后把最后一个命令删除掉
            this.redoComs.remove(command);
        }else {
            System.out.println("很抱歉，没有历史记录可以恢复！");
        }
    }

    // 提供给用户使用，执行加法功能
    public void addPressd(){
        this.addCommand.execute();
        // 把记录加到历史记录表
        undoComs.add(addCommand);
    }
    // 提供给用户使用，执行减法功能
    public void substractPressd(){
        this.subCommand.execute();
        // 把记录加到历史记录表
        undoComs.add(subCommand);
    }
}
